#include <stdio.h>

#ifndef EOS
#define EOS	'\0'


char *gcc_strncat (s1, s2, n)
char *s1;
const char *s2;
size_t n;
{
	char c;
	char *s = s1;
	
	/* Find the end of S1.  */
	do
	c = *s1++;
	while (c != '\0');
	
	/* Make S1 point before next character, so we can increment
	it while memory is read (wins on pipelined cpus).  */
	s1 -= 2;
	
	if (n >= 4)
	{
		size_t n4 = n >> 2;
		do
		{
			c = *s2++;
			*++s1 = c;
			if (c == '\0')
				return s;
			c = *s2++;
			*++s1 = c;
			if (c == '\0')
				return s;
			c = *s2++;
			*++s1 = c;
			if (c == '\0')
				return s;
			c = *s2++;
			*++s1 = c;
			if (c == '\0')
				return s;
		} while (--n4 > 0);
		n &= 3;
	}
	
	while (n > 0)
	{
		c = *s2++;
		*++s1 = c;
		if (c == '\0')
			return s;
		n--;
	}
	
	if (c != '\0')
		*++s1 = '\0';
	
	return s;
}

char * _strncat
(
 char *	 dst,  	/* string to append to */
 const char * src,   /* string to append */
 size_t	 n     	/* max no. of characters to append */
 )
{
	if (n != 0)
	{
		char *d = dst;		
		while (*d++ != EOS);			/* find end of string */		
		d--;					/* rewind back of EOS */
		while (((*d++ = *src++) != EOS) && (--n > 0));
		
		if (n == 0)
			*d = EOS;				/* NULL terminate string */
	}
	
	return (dst);
}


static void _main( void )
{
	char string[80] = "This is the initial string!";
	char suffix[] = " extra text to add to the string...";
	/* Combine strings with no more than 19 characters of suffix: */
	printf( "Before: %s\n", string );
	gcc_strncat( string, suffix, 19 );
	printf( "After:  %s\n", string );
}

#endif